package com.atguyigu.codesday01.Lock8Demo;

import java.io.InterruptedIOException;
import java.util.concurrent.TimeUnit;

                         //   对象锁      Phone phone = new Phone(); // 实例对象本身this  锁的是等号右边


                    /*
                        1 有两个线程标准访问，请问先打印邮件还是短信？
                        答：     ------Email"
                                -----SMS
                         2 邮件方法暂停4秒钟，请问先打印邮件还是短信？
                          答：   ------Email"
                                -----SMS
                   总结：
                       对象锁也叫实例锁，对应synchronized关键字，当多个线程访问多个实例时，
                       它们互不干扰，每个对象都拥有自己的锁，如果是单例模式下，那么就是变成和类锁一样的功能。
         对象锁防止在同一个时刻多个线程访问同一个对象的synchronized块。如果不是同一个对象就没有这样子的限制。

                   一个对象里面如果有多个synchronized方法，某一个时刻内，只要一个线程去调用其中的一个synchronized方法了，
                         其它的线程都只能等待，换句话说，某一个时刻内，只能有唯一一个线程去访问这些synchronized方法
                      锁的是当前对象this，被锁定后，其它的线程都不能进入到当前对象的其它的synchronized方法

  */





class Phone {
    public  synchronized void sendEmail() throws Exception {
        TimeUnit.SECONDS.sleep(4);
        System.out.println("------Email");
    }

    public  synchronized void sendSMS() throws Exception {
        System.out.println("-----SMS");

    }

}


public class Demo1 {

    public static void main(String[] args) throws InterruptedIOException, InterruptedException {

        Phone phone = new Phone(); // this
        Phone Phone2 = new Phone();

        new Thread(() -> {
            try {
                phone.sendEmail();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, "t1").start();

        Thread.sleep(10);

        new Thread(() -> {
            try {
                phone.sendSMS();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, "t2").start();


    }


}
